package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.FormacionAcademicaDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AcreditacionConvert;
import pe.gob.osce.sirenas.dao.convert.ExperienciaLaboralConvert;
import pe.gob.osce.sirenas.dao.convert.FormacionAcademicaConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.FormacionAcademicaDTO;
import pe.gob.osce.sirenas.model.jpa.Acreditacion;
import pe.gob.osce.sirenas.model.jpa.Capacitacion;
import pe.gob.osce.sirenas.model.jpa.ExperienciaLaboral;
import pe.gob.osce.sirenas.model.jpa.FichaArbitral;
import pe.gob.osce.sirenas.model.jpa.FormacionAcademica;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialFormacionAcademica;
import pe.gob.osce.sirenas.model.reporte.FiltroReporteDTO;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class FormacionAcademicaDAOImpl implements FormacionAcademicaDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	@Override
	public FormacionAcademica insertar(FormacionAcademica  formacionAcademica ) throws Exception {
		try{
			formacionAcademica=em.merge(formacionAcademica);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return formacionAcademica;
	}
	@Override
	public Boolean insertarHistorialFormacionGeneral(HistorialFormacionAcademica  historialFormacionAcademica ) throws Exception {
		boolean confirmacion= false;
		try {
			historialFormacionAcademica=em.merge(historialFormacionAcademica);
			em.flush();
			confirmacion=true;
		} catch (Exception e) {
			confirmacion=false;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}		
		return confirmacion;
	}

	@Override 
	public FormacionAcademica obtenerFormacionAcademica(Long idFormacionAcademica)
			throws Exception {
		FormacionAcademica		formacionAcademicaJPA=null;
		List<FormacionAcademica> 	listFormacionAcademicaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT form FROM FormacionAcademica form WHERE form.idFormacionAcademica = :idFormacionAcademica");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFormacionAcademica", idFormacionAcademica);
		
			List<FormacionAcademica>	listaObjeto= query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listFormacionAcademicaJPA=new ArrayList<FormacionAcademica>();
				for (FormacionAcademica obj: listaObjeto) {					
					formacionAcademicaJPA=(obj);
				}				
			}
		} catch (NoResultException nre) {
			formacionAcademicaJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return formacionAcademicaJPA;
	}	

	@Override 
	public List<FormacionAcademicaDTO>  obtenerListaFormacionAcademica(Long idFicha)
			throws Exception {

		List<FormacionAcademicaDTO> listFormacionAcademicaDTO=null;
		FichaArbitral fichaArbitralJPA=null;
		List<FormacionAcademica> listaFormacionAcademicaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();

			jpql.append("SELECT fa FROM FormacionAcademica fa  WHERE  fa.idFicha = :idFicha AND fa.estado=1 ORDER BY fa.auditoria.fechaRegistro DESC");
						
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			
			List<FormacionAcademica>	listaObjeto= query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listaFormacionAcademicaJPA=new ArrayList<FormacionAcademica>();
				for (FormacionAcademica obj: listaObjeto) {
					
					listaFormacionAcademicaJPA.add(obj);
				}
				listFormacionAcademicaDTO=FormacionAcademicaConvert.createListFormAcademicaDTO(listaFormacionAcademicaJPA);
			}		
		} catch (NoResultException nre) {
			listFormacionAcademicaDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listFormacionAcademicaDTO;
	}
	@Override 
	public List<HistorialFormacionAcademica> consultarHistorialFormacionAcademica(Long idFormacionAcademica)
			throws Exception {
		HistorialFormacionAcademica		formacionAcademicaJPA=null;
		List<HistorialFormacionAcademica> 	listHistorialFormacionAcademicaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT form FROM HistorialFormacionAcademica form WHERE form.idFormacionAcademica = :idFormacionAcademica");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFormacionAcademica", idFormacionAcademica);
		
			
			List<HistorialFormacionAcademica> listaObjeto=query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listHistorialFormacionAcademicaJPA=new ArrayList<HistorialFormacionAcademica>();
				for (HistorialFormacionAcademica obj  : listaObjeto) {
					listHistorialFormacionAcademicaJPA.add(obj);
				}
			}
			
		} catch (NoResultException nre) {
			listHistorialFormacionAcademicaJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listHistorialFormacionAcademicaJPA;
	}	
	

	@Override 
	public List<FormacionAcademicaDTO> obtenerReporteFormacionAcademica(Long idFicha,FiltroReporteDTO filtroReporteDTO) throws Exception {
		List<FormacionAcademicaDTO> listaFormAcademica=new ArrayList<FormacionAcademicaDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT forma FROM FormacionAcademica forma WHERE forma.estado=1 AND forma.idFicha=:idFicha ");
			
			if(filtroReporteDTO.getIndGradoObtenido()>0)
				jpql.append(" AND forma.indGradoObtenido = :indGradoObtenido");
			if(filtroReporteDTO.getIdAreaProfesion()>0)
				jpql.append(" AND forma.idAreaProfesion = :idAreaProfesion");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha",idFicha);

			if(filtroReporteDTO.getIndGradoObtenido()>0){
				query.setParameter("indGradoObtenido",filtroReporteDTO.getIndGradoObtenido()) ;
			}
			if(filtroReporteDTO.getIdAreaProfesion()>0){
				query.setParameter("idAreaProfesion",filtroReporteDTO.getIdAreaProfesion()) ;
			}

			List<FormacionAcademica>	listaObjeto=(List)query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				for (FormacionAcademica obj : listaObjeto) {					
					listaFormAcademica.add(FormacionAcademicaConvert.createDTO(obj));
				}	
			}
			
		} catch (NoResultException nre) {
			listaFormAcademica=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}		
		return listaFormAcademica;
	}
}
